import { HttpHeaders, HttpParams, HttpProgressEvent } from '@angular/common/http'

export interface AdRequestBaseParams {
  /**
   * 接口路径
   */
  url: string
  /**
   * 请求类型
   */
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE'
  /**
   * url参数
   */
  params?: HttpParams | { [param: string]: string | ReadonlyArray<string> }
  /**
   * 请求头
   */
  headers?: HttpHeaders | string | { [name: string]: string | string[] }
  /**
   * body参数
   */
  data?: any
  /**
   * 响应类型
   */
  responseType?: 'json' | 'text' | 'arraybuffer' | 'blob'
  /**
   * 响应结构
   */
  observe?: 'body' | 'events' | 'response'
  /**
   * 是否显示loading
   */
  isLoading?: boolean
  /**
   * 是否弹出提醒框
   */
  isNotify?: boolean
  /**
   * 提醒框标题
   */
  notifyTitle?: string
  /**
   * 提醒框文案
   */
  notifyMessage?: string

  /**
   * 请求失败提示
   */
  errorMessage?: string

  /**
   * 是否抛出请求错误提醒框
   */
  isThrowErrorNotify?: boolean

  /**
   * 上传进度监听
   * @param httpProgressEvent
   * @returns
   */
  uploadProgress?: (httpProgressEvent: HttpProgressEvent) => any

  /**
   * 下载进度监听
   * @param httpProgressEvent
   * @returns
   */
  downloadProgress?: (httpProgressEvent: HttpProgressEvent) => any

  /**
   * 业务异常编码集合 可通过回调对异常做单独处理
   */
  businessExceptionCodeSet?: string[]

  /**
   * 处理业务异常回调 业务异常编码集合包含异常code 会触发回调
   */
  handleBusinessExceptionCallBack?: (...data: any) => any
}

export interface AdRequestPromiseParams extends AdRequestBaseParams {
  isPromise?: true
}
export interface AdRequestObservableParams extends AdRequestBaseParams {
  isPromise: false
}

export interface AdHttpInterceptor {
  /**
   * http参数默认选项
   */
  defaultParameter: Omit<AdRequestPromiseParams, 'url'>

  /**
   * 请求发起前置操作 组装参数
   * @param parameter
   */
  requestBefore(
    parameter: AdRequestPromiseParams | AdRequestObservableParams
  ): [HttpParams, HttpHeaders]

  /**
   * 响应数据处理 业务异常处理
   * @param value
   * @param parameter
   */
  responseHandle(value, parameter: AdRequestPromiseParams | AdRequestObservableParams): any

  /**
   * 异常处理
   * @param error
   * @param parameter
   */
  catchError(error, parameter: AdRequestPromiseParams | AdRequestObservableParams): any

  /**
   * 请求结束回调
   * @param parameter
   */
  finalize(parameter: AdRequestPromiseParams | AdRequestObservableParams): any
}
